package com.cykj.user.util;

import com.cykj.common.utils.SnowflakeUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * @BelongsProject: smart_recruit_backend
 * @BelongsPackage: com.cykj.user.util
 * @Author: 浮行
 * @CreateTime: 2025-08-19 11:42
 * @Description: TODO
 * @Version: 1.0
 */
@Component
public class GetFileUtil {
    @Value("${fileUpload}")
    private String fileUpload;
    @Autowired
    private SnowflakeUtil snowflakeUtil;
    // 存储文件哈希值与路径的映射（实际项目中可以用Redis或数据库代替）
    private static final Map<String, String> fileHashCache = new HashMap<>();
 public String filesUpload(@RequestBody MultipartFile file){
     //判断文件是否为空
     if (file == null) {
         return "文件为空";
     }

     //获取原始文件名
     String originalFilename = file.getOriginalFilename();
     if (originalFilename == null || !originalFilename.contains(".")) {
         System.out.println("文件名格式错误（无后缀）");
         return null;
     }
     // 提取后缀
     String fileSuffix = originalFilename.substring(originalFilename.lastIndexOf("."));

     // 计算文件MD5哈希值
     String fileHash;
     try {
         fileHash = calculateFileMD5(file);
     } catch (IOException | NoSuchAlgorithmException e) {
         throw new RuntimeException("计算文件哈希值失败", e);
     }

     // 检查是否已存在相同文件
     if (fileHashCache.containsKey(fileHash)) {
         System.out.println("文件已存在，直接返回已有路径（秒传）");
         return fileHashCache.get(fileHash);
     }
     //判断文件类型，确定存放目录（如视频放video，图片放image）
     String fileDir;
     if (isImage(fileSuffix)) {
         fileDir = "image"; // 图片目录
     } else if (isPDF(fileSuffix)) {
         fileDir = "PDF"; // 视频目录
     } else {
            System.out.println("不支持的文件类型：" + fileSuffix);
         return null;
     }

     //获取文件唯一命名
     long uniqueFileName = snowflakeUtil.nextId();

     //拼接完整相对路径（如 "video/xxx.mp4"）
     String relativePath = "/" + fileDir + "/" + uniqueFileName + fileSuffix;
     System.out.println(relativePath);

     //上传路径可能不存在的情况
     File file1 = new File(fileUpload);
     //判断目录是否存在
     if (!file1.exists()) {
         //不存在就创建目录
         file1.mkdirs();
     }

     //文件上传
     try {
            file.transferTo(new File(fileUpload + "\\" + relativePath));
         // 将哈希值和路径存入缓存
         fileHashCache.put(fileHash, relativePath);
         System.out.println("文件上传成功：" + relativePath);
     } catch (IOException e) {
         throw new RuntimeException(e);
     }
     return relativePath;
 }
    /**
     * @Description: 计算文件的MD5哈希值
     * @Param: [file]
     * @return: java.lang.String
     */
    private String calculateFileMD5(MultipartFile file) throws IOException, NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("MD5");
        try (InputStream is = file.getInputStream()) {
            byte[] buffer = new byte[8192];
            int read;
            while ((read = is.read(buffer)) > 0) {
                md.update(buffer, 0, read);
            }
        }
        byte[] md5Bytes = md.digest();

        StringBuilder sb = new StringBuilder();
        for (byte b : md5Bytes) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }

    /**
     * @Description: 判断是否为图片文件（根据后缀）
     * @Param: [suffix]
     * @return: boolean
     */
    private boolean isImage(String suffix) {
        String[] imageSuffixes = {".jpg", ".jpeg", ".png", ".gif", ".bmp"};
        for (String s : imageSuffixes) {
            if (s.equals(suffix)) {
                return true;
            }
        }
        return false;
    }

    /**
     * @Description: 判断是否为pdf文件（根据后缀）
     * @Param: [suffix]
     * @return: boolean
     */
    private boolean isPDF(String pdfSuffix) {
        // 直接比较后缀是否为.pdf
        return ".pdf".equals(pdfSuffix);
    }
}
